/* nfgroups.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "event.h"

#include "err.h"
#include "msgtrans.h"
#include "nbgroups.h"
#include "newsbase.h"
#include "nfstr.h"

#define MALLOC_UNIT 256

void newsfind_addgroup(newsfind_groupinfo *groupinfo, const char *group)
{
  while (groupinfo->size < strlen(groupinfo->groups)+strlen(group)+2)
  {
    char *temp = groupinfo->groups;
    groupinfo->groups = realloc(temp, groupinfo->size + MALLOC_UNIT);
    if (!groupinfo->groups)
    {
      groupinfo->groups = temp;
      E(msgs_nomem());
      return;
    }
    groupinfo->size += MALLOC_UNIT;
    strcpy(groupinfo->groups, temp);
  }
  if (groupinfo->groups[0])
    strcat(groupinfo->groups, ",");
  strcpyC(groupinfo->groups + strlen(groupinfo->groups), group);
}

void newsfind_delgroup(newsfind_groupinfo *groupinfo, const char *group)
{
  char tgroup[256];
  char *substr;
  char *comma;
  strncpyC(tgroup, group, 256);
  substr = strstr(groupinfo->groups, tgroup);
  if (!substr)
  {
    err_complain(0, msgs_lookup("DelGroup"));
    return;
  }
  comma = strchr(substr, ',');
  if (!comma++)
  {
    substr[-1] = 0;
    return;
  }
  memmove(substr, comma, strlen(comma) + 1);
}

static int nbgroups_reply(WimpMessage *m, void *h)
{
  newsfind_groupinfo *groupinfo = (newsfind_groupinfo *) h;
  NewsBaseGroupList *nbgl = (NewsBaseGroupList *) m;
  if (nbgl->hdr.newsbase_action != NewsBase_ListGroups)
    return 0;
  if (nbgl->groupname[0] < 32)
  {
    (*groupinfo->complete)(groupinfo);
    E(event_deregister_message_handler(Wimp_MNewsBaseReply,
  	nbgroups_reply, h));
  }
  else
    newsfind_addgroup(groupinfo, nbgl->groupname);
  return 1;
}

void nbgroups_initialise(newsfind_groupinfo *groupinfo, const char *match)
{
  NewsBaseListGroups nblg;
  groupinfo->groups = malloc(MALLOC_UNIT);
  if (!groupinfo->groups)
    EF(msgs_nomem());
  groupinfo->groups[0] = 0;
  groupinfo->size = MALLOC_UNIT;
  EF(event_register_message_handler(Wimp_MNewsBaseReply,
  	nbgroups_reply, groupinfo));
  nblg.list_type = 0;
  strcpyC(nblg.groupname, match);
  newsbase_send(NewsBase_ListGroups, &nblg);
}
